//========================== 通信处理，参考https://yq.aliyun.com/articles/636357 ===============================//
var i = 0;
var lockReconnect = false; //避免websocket重复连接
var websocket = null;
//心跳检测
var heartCheck = {
    timeout: 3000, //单位为ms，如540000为9分钟发一次心跳
    timeoutObj: null,
    serverTimeoutObj: null,
    reset: function () {
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
    },
    start: function () {
        var self = this;
        this.timeoutObj = setTimeout(function () {
            //这里发送一个心跳，后端收到后，返回一个心跳消息，
            //onmessage拿到返回的心跳就说明连接正常
            websocket.send("ping");
            self.serverTimeoutObj = setTimeout(function () {
                //如果超过一定时间还没重置，说明后端主动断开了
                //如果onclose会执行reconnect，我们执行websocket.close()就行了.
                //如果直接执行reconnect 会触发onclose导致重连两次
                websocket.close();
            }, self.timeout)
        }, this.timeout)
    }
}

function createWebSocket(url) {
    try {
        if ('WebSocket' in window) {
            websocket = new WebSocket(url);
        } else if ('MozWebSocket' in window) {
            websocket = new MozWebSocket(url);
        } else {
            alert("您的浏览器不支持websocket协议,建议使用新版谷歌、火狐等浏览器，" +
                "请勿使用IE10以下浏览器，360浏览器请使用极速模式，不要使用兼容模式！");
        }
        initEventHandle();
    } catch (e) {
        reconnect(url);
        console.log(e);
    }
}

// 监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
window.onbeforeunload = function () {
    websocket.close();
}

function reconnect(url) {
    if (lockReconnect) return;
    lockReconnect = true;
    setTimeout(function () { //没连接上会一直重连，设置延迟避免请求过多
        let m = `正在尝试第 ${i++} 次连接`;
        console.log(m);
        $('#message').append(m);
        createWebSocket(url);
        lockReconnect = false;
    }, 2000);
}

//将消息显示在网页上
function appendMessage(message) {
    console.log('收到WebSocket消息：' + message);
}

//关闭连接
function closeWebSocket() {
    websocket.close();
}

// 把JSON发送到指定的客户端
function sendTo(toCid, json) {
    json.cid = cid;
    json.toCid = toCid;
    websocket.send(JSON.stringify(json));
}

function sendToServer() {
    var data = JSON.parse($('#text').val());
    websocket.send(JSON.stringify(data));
    $('#text').focus();
}

// 初始化处理
function initEventHandle() {
    websocket.onclose = function () {
        reconnect(wsUrl);
        onmessageHandler(new Date().toUTCString() + "：连接关闭!");
    };
    websocket.onerror = function () {
        reconnect(wsUrl);
        onmessageHandler("WebSocket连接错误!");
    };
    websocket.onopen = function () {
        heartCheck.reset().start(); //心跳检测重置
        onopenHandler();
        i = 0;
    };
    websocket.onmessage = function (event) {
        //公共操作开始
        //如果获取到消息，心跳检测重置，因为拿到任何消息都说明当前连接是正常的
        heartCheck.reset().start();
        onmessageHandler(event.data);
        if (event.data == 'ping') {
            return;
        }
    };
}









































